package com.rhf.core.commons.logging;

import org.apache.log4j.Logger;

import java.io.File;

import com.rhf.core.commons.properties.Define;
import com.rhf.core.commons.properties.PropertiesManager;


/**
 * Classe pour g�rer les logs
 *
 * @author fabiensaulnier
 *
 */
public class AppLog {
    /**
     * Fichier de propri�t�s log4j
     */
    private static final String LOG4J_FILE_NAME = "log4j.properties";

    /**
     * log4j objet
     */
    private Logger logger;

    /**
     * Constructeur par d�faut
     * @param loggerName
     */
    protected AppLog(String loggerName) {
        initLogger(loggerName);
    }

    /**
     * Get the application logger
     * 
     * @param loggerName
     * @return the application logger
     */
    private Logger initLogger(String loggerName) {
        if (logger == null) {
        	// R�cup�ration du chemin de l'application
            String homeDirectory = PropertiesManager.getProperties().getString(Define.USER_HOME);

            // R�cup�ration du chemin du fichier de propri�t�s log4j
            String log4jPath = homeDirectory + File.separator + Define.CONF_DIR + File.separator + LOG4J_FILE_NAME;

            org.apache.log4j.PropertyConfigurator.configure(log4jPath);
            logger = Logger.getLogger(loggerName);
        }

        return logger;
    }

    /**
     * Ecrire un message 'debug' dans l'application
     * @param message
     */
    public void debug(String message) {
        if (logger.isDebugEnabled()) {
            Throwable t = new Throwable();
            StackTraceElement directCaller = t.getStackTrace()[1];
            logger.debug(directCaller.getClassName() + " - " + directCaller.getMethodName() + " - line:" + directCaller.getLineNumber() + " " + message);
        }
    }

    /**
     * Ecrire un message 'info' dans l'application
     * @param message
     */
    public void info(String message) {
        if (logger.isInfoEnabled()) {
            Throwable t = new Throwable();
            StackTraceElement directCaller = t.getStackTrace()[1];
            logger.info(directCaller.getClassName() + " - " + directCaller.getMethodName() + " - line:" + directCaller.getLineNumber() + " " + message);
        }
    }

    /**
     * Ecrire un message 'erreur' dans l'application
     * @param message
     */
    public void error(String message) {
        Throwable t = new Throwable();
        StackTraceElement directCaller = t.getStackTrace()[1];
        logger.error(directCaller.getClassName() + " - " + directCaller.getMethodName() + " - line:" + directCaller.getLineNumber() + " " + message);
    }

    /**
     * Ecrire un message 'erreur' dans l'application avec le message d'erreur Java
     * @param message
     * @param t
     */
    public void error(String message, Throwable t) {
        StackTraceElement directCaller = t.getStackTrace()[1];
        logger.error(directCaller.getClassName() + " - " + directCaller.getMethodName() + " - line:" + directCaller.getLineNumber() + " " + message, t);
    }

    /**
     * Ecrire un message 'warn' dans l'application
     * @param message
     */
    public void warn(String message) {
        Throwable t = new Throwable();
        StackTraceElement directCaller = t.getStackTrace()[1];
        logger.warn(directCaller.getClassName() + " - " + directCaller.getMethodName() + " - line:" + directCaller.getLineNumber() + " " + message);
    }
}
